ver1.4.2 2022-12-05更新
1.前提条件
2.インストール方法
3.基本コンセプト
4.使い方
5.メニューについて
6.RomMap.xmlの記述方法
7.ShortCut.xmlの記述方法
8.PreDefineTableの記述方法
9.SFCGENEditor.iniの記述方法
10.その他
11.参考サイト
このツールはSFC(SNES)のROMを読み込んで内容を参照、変更、保存することを目的としたものです。ROMの内容を一部ではなく全部そのままメモリ上に展開するのでそれなりにメモリ量を必要とします(ROMの最大容量はせいぜい8MBなので近年のPCのメモリ量ならそれほど問題にならないと思いますが)。情報を公開してくれた先人の努力に感謝します。ver0.7.0より、プラグイン方式を導入し、各ROM固有の部分(主にSFC版DQ3,6)をプラグインとして切り出し、共通部分から分離しています。これにより、汎用性、固有性の両方を確保したまま拡張することが可能になりました。このreadmeは本体部分の説明を対象にしています。
万人が使うものでもないと思うので、前提条件を満たしていない場合の動作やエラー発生時のハンドリングはあまり考えていません。現状このツールできることは以下のとおりです。
- 固定長データ部分の参照・変更・ROM中の場所移動
- 引数情報を加味したSR(サブルーチン、プログラム)部分のリアルタイム?逆アセンブル,SRからコールしている別のSRへの1クリックジャンプ,SRアドレスのリストの指すSRの逆アセンブル、SRの編集
- ROM中のデータ・SRの位置の一覧
本ツールを使用して発生したいかなる損害についても一切責任を負いません。またROMの入手方法についての質問も一切お答えできませんのでご了承ください。
本ソフトウェアはフリーウェアですが、ソースコードは公開しません。
2次配布は禁止とします。
2-1)モジュール構成
SFCGENEditor.exe
PluginBase.dll
Be.Windows.Forms.HexBox_Custom.dll(バイナリエディタコントロール用)
Plugins(フォルダ)
プラグイン用DLL
起動時に起動したカレントディレクトリのSettingsフォルダの下にあるRomMap.xml、ShortCut.xmlとその中のPDTablesフォルダの中のファイル(PreDefineTable)を読みます。SFCGENEditor.iniもカレントディレクトリのファイルを読みます。
例)SFCGENEditor.exeをC:Program FilesSFCGENEditorフォルダに置き、ゲームX、ゲームYのSettingsファイルをC:GameX, C:GameYに配置した場合
C:Program FilesSFCGENEditor
-SFCGENEditor.exe (Aとする)
-PluinBase.dll(同B)
-他
-Plugins
-各種プラグインDLL(同C)
C:GameX
-Settings (同P)
-SFCGENEDitor.ini (同Q)
-SFCGENEDitor.exe(A)へのショートカット(同X)
C:GameY
-Settings (同R)
-SFCGENEDitor.ini (同S)
-SFCGENEDitor.exe(A)へのショートカット(同Y)
C:GameA、C:GameBにショートカットファイル(X),(Y)を置き、これらをダブルクリックすることで
Xをダブルクリックした場合はP,Qの設定を使って、Yをダブルクリックした場合はR,Sの設定を使ってプログラムが起動します。
プラグインはBもしくはCのものが使用されます。
また、「ROMを開く」を選択した場合に開くファイルダイアログの初期ディレクトリはショートカットのあるフォルダになるので、ここにROMイメージを入れておけばゲームごとの管理がそれぞれのフォルダで完結します。
ShortCut.xmlには、ショートカットキーを割り当てる項目とそのキーの情報をXMLフォーマットで記述します。
PreDefineTableはデータを画面に表示する場合に人間に見やすい情報に変換するための情報を1テーブル1ファイルに記述します(変更の仕方については後述します)。ROMファイルを読み込んだときに、これらの情報に従ってROMを解析し、人間に見やすい情報に変換します。
読み込んだROMはバイナリ配列として内部で保持し、ツール上での変更をすぐさまこの配列に反映します。ROM保存時にはこのバイナリ配列をファイルにそのまま書き出すだけです。
※デフォルトのSettingsフォルダの中身ははSFC版DQ3用のものです。SettingsDQ3_ExtendedはSFC版DQ3職人用拡張パッチ(通称DQ3 extended ver1.44以降 http://dqnbinary.jp.land.to/cgi-bin/img/457.zip)用のファイルです。パッチ対応のROMを編集したい場合は、SettingsDQ3_ExtendedをSettingsにリネームして使用してください。
※SettingsDQ6はSFC版DQ6用のものです。DQ6のROMを読み込むときはSettingsにリネームしてからSFCGENEditorを起動してください。
左ペイン(①)がツリービューペイン、右上ペイン(②)をデータペイン、右下(③)を追加情報ペインと呼ぶことにします。
ROMの内容をツリー構造で表示します。ツリー構造自体はRomMap.xmlに記述されているので変更可能です。見たいデータをクリックするとデータペインに解析された状態でデータが表示されます。一番下に「ROM索引」というノードがあります。ここをクリックするとROM内の情報の所在がデータペインに表示されます。
RomMap.xmlの設定によって3種類の表示ができます。
基本はBNE2などと同様に解析結果を行列の状態で展開します。その場で値を変更できます。(セルのダブルクリックもしくはF2で編集開始です F2のほうが使いやすいはず。)
16進表記のデータは編集時に先頭に「$」(RomMap.xmlのHexPrefixで指定した文字列)が付いて、16進数で編集できるようになりました。
入力可能な範囲外の入力の場合は編集を受け付けないようになりました。(例:0-63の範囲なのに100を入力した場合など)固定長データに対し、レコード途中に複数行まとめて削除/挿入できるようにしました。処理したいレコードにフォーカスを移動し、右クリックでメニューを表示してください。
画像の格納方法はROMごとに異なるため、対応は各プラグインで行うことになります。
SR(SubRoutine,プログラムのこと)を逆アセンブルした結果を表示します。別のSRをコールしている行をダブルクリックするとそのSRにジャンプします。$FCの場合はジャンプしたいSRのインデックスを入力するウィンドウが出るので範囲内の数値を入れるとそのSRにジャンプします。Valsの列で編集します。半角スペースで区切って2文字ずつ16進で入力してください。変更を確定するとその場で再度逆アセンブリを行い、結果を表示します。SRの長さが増える場合は後ろに十分な空き領域が必要です。別のSRをコールしている行のValsの列をダブルクリックしてもコール先のSRに飛ばず、編集モードに移行するだけにしました。別のSRにジャンプしたい場合はValsの列以外をダブルクリックしてください。2文字ずつ区切らなくても入力できるようにしました。2文字以上で入力した場合はリトルエンディアン方式で変換されます。分岐命令、ジャンプ命令に対して、ジャンプ先のチェックをするようにしました。ジャンプ先がSR定義外の場合は背景色を薄青、ジャンプ先がSR内だが不正なアドレス(例:22 xx xx xxの2バイト目にジャンプなど)の場合は赤、それ以外の未検証の場合は薄灰で表示するようにし、ケアレスミスによるバグを見つけやすいようにしました。複数行(1行だけでも可・離れた複数行も可)を選択した状態で右クリックすると「選択行を削除」メニューが表示され、一度に複数行を削除できるようにしました。
データ表示モードの場合に現在選択している行のバイナリイメージを表示します。表示だけです。SR編集モードの場合はSR内で呼んでいる別のSRのリストを引数付きで表示します。
※画像中のメニューをクリックすると個別の説明にジャンプします。
ROMファイルを開いてメモリ中に展開します。本プログラムで行う変更はすべてメモリ中のROMイメージに対して行います。ヘッダの有無のチェックはしないので、事前にヘッダは削ってください。ファイルを選択する際に「読み取り専用で開く」にチェックを入れるとROMに対する変更が一切できない状態になります。うっかり触って変えてしまいたくない場合に使用します。
読み取り専用モードは次回「ROMを開く」で再度ROMファイルを読みなおす際にリセットされます。読取り専用モードでもデータ、SRの定義、変更、削除(定義のみ)は行えます。
現在メモリ中にあるROMイメージをファイルに保存します。
現在メモリ中にあるROMイメージを捨てます。
ROM名、チェックサムを編集できます。
チェックサムの計算が(一応)正しくできるようになったので、現在のチェックサムを計算して表示する「チェックサム計算」、計算したチェックサムを適用する「チェックサム変更」ボタンを追加しました。チェックサムの計算ルールは4MB未満は1バイトずつ加算、4MB以降は2倍して加算した下位2バイトです。この計算ルールで一応SNES9Xのチェックサム計算と一致しているようですが、これ以外のルールが存在する場合は対応していません。
「ROM保存時にチェックサムを自動調整」にチェックを入れるとROM保存時に自動でチェックサムを調整するようにします。
指定したファイルをバイナリ形式で読み込み、指定のアドレスから上書き(置き換え)します。開始アドレス、終了アドレスがROMの範囲外だった場合にはインポートしません。
インポートするファイルの中の一部を範囲指定してインポートできるようにしました(上書きを開始するアドレスを指定した後に全部をインポートするか範囲指定するかを選択するダイアログを表示するようにしました)。従来通りファイル全部をインポートすることもできます。
PDTablesフォルダの下のcsvファイルを再読み込みします。今まではPDTablesフォルダの内容は起動時にしか読み込まないため、PDTables以下のファイルを変更した場合はプログラムを再起動する必要がありましたが変更後このメニューを選ぶことで不要になりました。
RomMap.xmlの基本情報(対象ROM名、ROMサイズ、コメント等)を編集できます。ROMをロードしている間は対象ROM名、ROMサイズは変更できません(変更するとプラグインも変わる可能性があるため)。また、プログラム起動時にRomMap.xmlがSettingsフォルダの下に存在しない場合、このダイアログがまず表示され、基本情報を入力することを要求されます。これにより、0からRomMap.xmlをこのプログラム上で定義できるようになりました。
RomMap.xmlファイルを再度読み込み、その情報に従ってメモリ中のROMイメージを再解析します。
その時点でのRomMap情報をファイルに保存します。読み込んだ元のRomMap.xml中のコメントは先頭にあるもののみ復元されます。また、その時点でSettingsフォルダにあるRomMap.xmlをバックアップすることも可能です(保存時に聞いてくる)。バックアップすると、元のファイルは「RomMapYYYYMMDDHHNN.xml」にリネームされます。同じファイル名が既に存在する場合は消してリネームします。
プログラムを終了します。終了時にメモリ中のROMイメージ、RomMapが未保存状態の場合は保存するか確認します。
※画像中のメニューをクリックすると個別の説明にジャンプします。
ツリービューペイン、データビューペインに対する検索ができます。
追加情報ペインに対する検索機能は未実装です。
16進文字列をスペース区切りで指定するとROM中をそのパターンで検索し該当する箇所をリストアップします。基本的にはStirlingの検索機能と同じですが、検索範囲や「データ定義のみ」「プログラムのみ」「空(未定義部分)も検索する」の指定ができます。パターンとして指定できるのは32バイト分で表示される検索結果は最大100件までです。また、この機能を利用してプログラム逆アセンブル内容を表示中に右クリックで「このSRをコールしている場所を検索」メニューを追加してあります。プログラムの定義状態(JSRかJSLか)に応じて検索範囲を決定し、このダイアログを表示し検索を行います。
指定した行にスクロールします。16進入力も可能です。
指定したアドレス近辺のノードにジャンプします。ツリービューペインにフォーカスがある場合は指定アドレスに一番近いノードにフォーカスを移動、ROM索引表示中にROM索引のデータビューペインにフォーカスがある場合は指定アドレスに一番近いレコードにフォーカスを移動します。
アドレスを入力するとそのアドレスから始まるのが何を意味するのか(RomMapに定義されていれば)を返します。
ROM索引の内容がデータペインに表示されているときのみ使用可能です。移動したい行を選択してこのメニューを選択すると移動先のアドレスを入力するように求められます。移動先に十分な空きがあれば移動できますが、移動先が単に未解析のために「空き」と表示されていても移動できてしまうので、本当に空いていると確認できる場所にのみ移動してください。また、移動したデータを参照している部分の変更は自動では行いません。移動前の領域は0xFFで初期化されます。
固定長データを参照中に、現在クリップボードにあるタブ区切り文字列、カンマ区切り文字列(CSV)を現在のセルを起点に一括コピーします。Excelなどで値を操作した後書き戻したい、というような場合に便利です。ドロップダウンコンボボックスになっているセルに対しては選択肢のキャプションが一致していれば正しくコピーできます。Undo機能が無いので、コピー後「やっぱやめたい」という場合に元に戻す手段がありませんので、作業前にバックアップをとっておく、など気を払ってください(作者的には、それほど頻繁には使用しないがあると作業が楽になる局面がある、という感じの実装意図です)。
現在ツリービューペインで選択している固定長データをバイナリ情報から再度読み込みます。
フィールドにSRの開始アドレスが含まれる場合、それらの逆アセンブルも行います。
現在フォーカスのある項目がデータ型、アドレスである場合には配列の数を変更できます。レコード数を増やす場合は後ろにその分の空き領域が必要です。
現在フォーカスのある項目がデータ型、アドレスである場合には1レコードのサイズを変更できます。サイズ変更に伴うデータのズレは自動で調整されます。レコードサイズを増やす場合は後ろにその分の空き領域が必要です。
固定長データに対し、同一テーブル内の別のレコードを範囲指定でコピーします。
SRの定義を追加します。定義を追加する場所はすでに開始位置として他で定義されているアドレス以外はどこでも可能です。レジスタ(A,X,Y)の場合はスタートバイトの列にA,X,Yと記述してください。それ以外の場合(SRコールの後の数バイトを引数とする場合)はスタートバイトを16進(0xXX,$XXなど)で記述してください。
SRの定義を変更します。ツリービューで対象のSRのノードを選択しておくか、ROM索引上で対象のSRのレコードを選択しておくことでそのSRの定義情報を削除できます。
このSRをコールしている箇所をバイナリパターン検索を使用して検索します。SRの定義によって同バンク内かROM中全部を検索するかが変わります。
その時点でのROMイメージをバイナリエディタ上で編集できます。バイナリエディタコントロールはBe.HexEditor(http://hexbox.sourceforge.net/)をカスタムしStirlingライクなカーソル移動ができるようにした自前ビルド版を使用します。あくまで補助という位置づけなので豪華機能にする予定はありません。検索、Undoくらいは実装したいですが「あくまで補助」なのであまり期待はしないでください。
現在表示している画像をファイル名を指定してビットマップ形式(24ビット)で保存します。
※画像中のメニューをクリックすると個別の説明にジャンプします。
※画像中のメニューをクリックすると個別の説明にジャンプします。
1つ前(後)に見ていた情報に移動します。Webブラウザの前へ,次への感覚で使ってください。履歴は最新の30個まで保存しています。履歴の数は変更できません。
ROM索引の画面に移動します。
現在表示している内容のROM索引中のアドレス位置にジャンプします。
ツリービューペインにフォーカスを移動します。
データペインにフォーカスを移動します(画像表示モードの場合を除く)。
追加情報ペインにフォーカスを移動します。
SFCGENEditorのプログラムバージョン、プラグインの情報・バージョンを表示します。
※記述例:
1 2 3 4 5 6 |
<?xml version="1.0" encoding="utf-8"?> <menuoption> <shortcut key="ALT,CTRL,B" nodename="戦闘メッセージ"></shortcut> <shortcut key="CTRL,M" nodename="メッセージ"></shortcut> <shortcut key="CTRL,A" nodename="NPC1"></shortcut> </menuoption> |
名称 | 分類 | 説明 |
---|---|---|
menuoption | タグ | トップのタグです。必須なので消さないで下さい。 |
shortcut | タグ | 「移動」メニューに追加するショートカットメニュー1つを記述します。 |
key | アトリビュート | ショートカットキーを指定します(大文字小文字は問わない)。Ctrl+?、Alt+?、Ctrl+Alt+?のいずれかが指定可能です(CTRL+ALT+?の場合のCTRL、ALTの順番は順不同)。?に指定できるのは数字もしくはアルファベット1文字です。F?(ファンクションキー)には現時点では対応していません。また、すでに存在しているショートカットキーと重複して設定は可能ですがその場合の動作は保証されません。ぶつからないように設定してください。 |
nodename | アトリビュート | ショートカットキーによってジャンプしたいツリービュー上のノードの名称を指定します。 |
設定例:省略しない場合
1 2 3 4 5 6 7 8 9 10 |
床,0 宝箱,1 ,2 ,3 ツボ,4 タル,5 ,6 タンス,7 クローゼット,8 ,9 |
設定例:省略する場合
1 2 3 4 |
上 (0を自動でアサイン) 右 (1を自動でアサイン) 下 (2を自動でアサイン) 左 (3を自動でアサイン) |
1テーブルの中でvalueを指定したりしなかったりした場合の動作の確認はしていません。全レコード指定する/しないで統一してください。
「ROMを開く」「ROMを保存」で表示されるファイルオープンダイアログでフィルターされる拡張子を指定する。記述方法はプログラム中で指定するオープンファイルダイアログのフィルターとして設定する文字列と全く同じ。
|フィルター文字列|拡張子(複数指定可能)
が1セットとなる。フィルターを複数設定したい場合は並べて複数記述するだけ。
設定例:
1 2 |
[ROM] DefaultROMExt=|SMCファイル(*.smc)|*.smc(デフォルト) |
「ROMを開く」で表示されるファイルオープンダイアログで表示される初期ディレクトリを指定する。指定がない場合はカレントディレクトリを使う。
ROM保存時にチェックサムを自動で調整する。
0:調整しない(デフォルト)
1:調整する
設定例:
1 2 |
[ROM] CheckSumAutoAdjust=1 (調整する) |
プログラム起動時に保存された座標情報を元にウィンドウ座標をリストアする。記録するのはプログラム終了時のみ。Left(ウィンドウの左端のX座標),Top(ウィンドウの上端のY座標),Width(水平方向の幅),Height(垂直方向の高さ)を,(カンマ)区切りで記述する。例外として、最大化の場合は”Maximized”、最小化の場合は”Minimized”と記述する。
設定例:
1 2 3 4 |
[app] WindowPos=Maximized (最大化) WindowPos=Minimized (最小化) WindowPos=22,22,785,488 (座標指定時) |
プラグイン中のアイコンを使用しない。
0:使用しない
1:使用する(デフォルト)
設定例:
1 2 |
[app] UseDefaultIcon=0 (使用しない) |
新規SR定義、既存SR変更ダイアログでSR後のm,xフラグを指定できるコンボボックスを表示する。SRコールした後m,xフラグが変化する一部ゲーム(グラディウスⅢ?)で使用する。
0:表示しない(デフォルト)
1:表示する
設定例:
1 2 |
[app] ShowPostMXInSR=1 (使用する) |
起動時に使用するSettingsフォルダを選択するダイアログを表示するか
0:表示しない
1:表示する(デフォルト)
設定例:
1 2 |
[app] ShowSSFolder=1 (使用する) |
-
filename:ROMファイル名を引数で指定することでそのROMファイルを開いて解釈した状態で起動します。フルパスで指定しなかった場合はSFCGENEditorと同じパスにあるものとして扱います。相対パスでの指定も可能です。
例:
1>SFCGENEditor dq3sfc.smc - /L: Lightモード プログラムの逆アセンブルを行いません。
- 65816命令表
- 6502/65816 opecodes
- SNES研究室
- SNES 4BPP file format(リンク切れ)
- SNES Kart(リンク切れ)